﻿#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
//void test2(int* p)
//{
//	printf("%zd\n", sizeof(p));//直接相当于指针所占字节数
//}
//void test1(int arr[])//既然传递的是数组名，那就是地址，地址需要用指针来接受，指针4/8个字节
//{
//	printf("%zd\n", sizeof(arr));//这时候所测的是指针类型大小
//}
//int main()
//{
//	int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
//	printf("&arr[0]= %p\n", &arr[0]);
//	printf("&arr   = %p\n", &arr);
//	printf("arr    = %p\n", arr);//数组名是首元素地址，三个结果一样
//	printf("&arr[0]+1= %p\n", &arr[0]+1);//跳过一个int 字节指向arr[1]的地址
//	printf("&arr+1   = %p\n", &arr+1);//跳过整个数组10个int字节所指向的地址
//	printf("arr+1    = %p\n", arr+1);//跳过一个int 字节指向arr[1]的地址
//	printf("%zd\n", sizeof(arr));//输出的是整个数组所占字节
//	test1(arr);//传递的是数组名
//	test2(arr);//传递的是数组名
//	return 0;
//}
//指针访问数组
//int main()
//{
//	int arr[10] = { 0 };
//	int* p = arr;
//	int i = 0;
//	for (i = 0;i < 10;i++)
//	{
//		scanf("%d", p+i);//p对应的是数组首元素地址,所以不需要&取地址符号，p+i==&arr[i]
//		printf("%d ", *(p + i));//*解引用取出所对应的数值，*（p+i)==p[i]==arr[i]
//		//printf("%d ", p[i]);//*解引用取出所对应的数值，*（p+i)==p[i]==arr[i]
//		//printf("%d ", arr[i]);//*解引用取出所对应的数值，*（p+i)==p[i]==arr[i]
//
//	}
//	return 0;
//}
//int main()
//{
//	int a = 10;
//	int* pa = &a;
//	//ppa指向一级指针的二级指针
//	//指向的是*pa所指向的地址，**ppa才是对*pa内容进行解引用
//	int** ppa = &pa;
//	printf("%d\n", a);
//	printf("%d\n", *pa);
//	printf("%d\n", **ppa);
//}
//指针数组
//int main()
//{
//	int arr1[] = { 1,2,3,4,5 };
//	int arr2[] = { 2,3,4,5,6 };
//	int arr3[] = { 3,4,5,6,7 };
//	//数组名是数组⾸元素的地址，类型是int*的，就可以存放在parr数组中
//	int* parr[3] = { arr1,arr2,arr3 };
//	int i = 0;
//	int j = 0;
//	for (i = 0;i < 3;i++)//行
//	{
//		for (j = 0;j < 5;j++)//列
//		{
//			//printf("%d ", parr[i][j]);
//			//printf("%d ", *((parr[i]) + j));
//			printf("%d ", *(*(parr+i) + j));
//		}
//		printf("\n");
//	}
//	return 0;
//}
// 字符指针
//int main()
//{
//	char ch = 's';
//	char* p = &ch;
//	printf("%c\n", *p);
//	return 0;
//}
//int main()
//{
//	const char* p = "abcdef";//这里是把字符串的首地址传递给p,这样就可以直接顺藤摸瓜找到字符串中所有字符
//	printf("%s\n", p);//指针指向字符串的首地址，并非整个字符串
//	return 0;
//}
//#include <stdio.h>
//int main()
//{
//	char str1[] = "hello world";
//	char str2[] = "hello world";
//	const char* str3 = "hello world";
//	const char* str4 = "hello world";
//	//str1和str2是创建连个字符数组，虽然内容相同，但这里直接比较的是地址，地址不相同
//	if (str1 == str2)
//		printf("str1 and str2 are same\n");
//	else
//		printf("str1 and str2 are not same\n");
//	//arr3和arr4为指针指向相同的字符串首地址，所以对应的地址相同
//	if (str3 == str4)
//		printf("str3 and str4 are same\n");
//	else
//		printf("str3 and str4 are not same\n");
//	return 0;
//}
//数组指针
//int arr[10] = { 0 };
//int (*p)[10] = &arr;
//void test(int(*p)[5], int row, int col)
//{
//	int i = 0;
//	for (i = 0;i < row; i++)
//	{
//		int j = 0;
//		for (j = 0;j < col;j++)
//		{
//			printf("%d ", *(*(p + i) + j));
//		}
//		printf("\n");
//	}
//}
//int main()
//{
//	int arr[2][5] = { {1,2,3,4,5},{6,7,8,9,10} };
//	test(arr, 2, 5);//二维数组传参其实是第一行的地址
//	return 0;
//}
//函数指针
//int add(int x, int y)
//{
//	return x + y;
//}
//int main()
//{
//	//可以发现，函数名就是地址，这个&地址符号可以省略
//	printf("%p\n", add);
//	printf("%p\n", &add);
//	int (*pf)(int, int) = &add;
//	int (*pff)(int, int) = add;
//	//在使用函数指针的时候，可以把函数指针的*解引用操作符省略
//	printf("%d\n", pf(2, 3));
//	printf("%d\n", (*pf)(3, 3));
//	return 0;
//}
//int main()
//{
//	(*( void (*)() )0)();
//	//这个代码可以看成
//	//1 ( void (*)() ) 0-- 强制类型转换
//	// 将int类型的0转换成函数指针类型,意思是想让0做函数的地址              
//	//(*( void (*)() )0)();
//	//1. 将0转化成函数的地址,但这个这个函数是没有参数的,返回类型是void空类型
//	//2. 通过去调用0地址出的这个函数
//	void (*signal(int, void(*)(int) ))(int);
//	//一次函数声明，函数名是singal
//	//两个参数第一个int 第二个是函数指针void(*)(int)类型，参数是int 返回值是void空类型
//	//signal函数返回值是函数指针类型void(*)(int),参数为int
//	return 0;
//}
//转移表
//void menu()
//{
//	printf("*******1.add 2.sub*******\n");
//	printf("*******3.mul 4.div*******\n");
//	printf("*******0.exit     *******\n");
//}
//int add(int x, int y)
//{
//	return x + y;
//}
//int sub(int x, int y)
//{
//	return x - y;
//}
//int mul(int x, int y)
//{
//	return x * y;
//}
//int div(int x, int y)
//{
//	return x / y;
//}
//int main()
//{
//	int x = 0;
//	int y = 0;
//	int input = 0;
//	int ret = 0;
//	int (*p[5])(int x, int y) = { NULL,add,sub,mul,div };//创建一个函数指针数组，进行加减乘除运算选择
//	do
//	{
//		menu();
//		scanf("%d", &input);
//		if (input >= 1 && input <= 4)
//		{
//			printf("请输入两个整数：");
//			scanf("%d %d", &x, &y);
//			ret = (*p[input])(x,y);//借助函数指针数组调用加减乘除运算函数
//			printf("%d\n", ret);
//	   }
//		else if (input == 0)
//		{
//			printf("退出计算\n");
//			break;
//		}
//		else
//		{
//			printf("输入错误，请重新选择：");
//		}
//	} while (input);
//	return 0;
//}
//int main()
//{
//	int x = 0;
//	int y = 0;
//	int input = 0;
//	int ret = 0;
//	do
//	{
//		menu();
//		scanf("%d", &input);
//		switch (input)
//		{
//		case 1:
//			printf("请输入两个整数: ");
//			scanf("%d %d", &x, &y);
//			ret = add(x, y);
//			printf("%d\n", ret);
//			break;
//		case 2:
//			printf("请输入两个整数: ");
//			scanf("%d %d", &x, &y);
//			ret = sub(x, y);
//			printf("%d\n", ret);
//			break;
//		case 3:
//			printf("请输入两个整数: ");
//			scanf("%d %d", &x, &y);
//			ret = mul(x, y);
//			printf("%d\n", ret);
//			break;
//		case 4:
//			printf("请输入两个整数: ");
//			scanf("%d %d", &x, &y);
//			ret = div(x, y);
//			printf("%d\n", ret);
//			break;
//		default:
//			printf("请重新输入\n");
//			break;
//		}
//	} while (input);//输入0截止
//	return 0;
//}
//void calc(int(*p)(int , int ))//函数指针可以不写参数
//{
//	int x = 0;
//	int y = 0;
//	printf("请输入两个整数：");
//	scanf("%d %d", &x, &y);
//	printf("%d\n", (*p)(x, y));
//}
//int main()
//{
//	int x = 0;
//	int y = 0;
//	int input = 0;
//	int ret = 0;
//	do
//	{
//		menu();
//		scanf("%d", &input);
//		switch (input)
//		{
//		case 1:
//			calc(add);
//			break;
//		case 2:
//			calc(sub);
//			break;
//		case 3:
//			calc(mul);
//			break;
//		case 4:
//			calc(div);
//			break;
//		default:
//			printf("请重新输入\n");
//			break;
//		}
//	} while (input);//输入0截止
//	return 0;
//}
//以下为4个嫌疑犯的供词:
//A说：不是我。
//B说：是C。
//C说：是D。
//D说：C在胡说
//已知3个人说了真话，1个人说的是假话。
int main()
{
	int killer = 0;

	for (killer = 'A';killer <= 'D';killer++)
	{
		//利用关系运算符真返回1，假返回0
		//存在三个关系返回值相加为3，这里可以循环凶手是谁时满足三个
		if ((killer != 'A') + (killer == 'C') + (killer == 'D') + (killer != 'D') == 3)
		{
		   printf("凶手是%c\n", killer);
		}
	}
	return 0;
}